package br.com.vilababy.sigvb.modelo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Months;
import org.joda.time.Years;

import br.com.vilababy.sigvb.constantes.SIGVBEnum;

@Entity
public class Aluno extends SIGVBModelo implements Serializable{

	/**
	 * @author Diego Patrick da Silva Santos
	 */
	private static final long serialVersionUID = 1L;
	
	@Id @GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="codigo_aluno")
	private Long id;
	@Column(name="data_nascimento", length=273)
	@Temporal(TemporalType.DATE)
	private Date dataNascimento;
	private Unidade unidade;
	@Column(nullable=false)
	private Boolean isento;
	@Column(name="sorriso_sapeca", nullable=false)
	private Boolean sorrisoSapeca;
	@Column(nullable=false, length=180)
	private String nome;
	@Column(length=100)
	private String apelido;
	private String observacao;
	@Column(name="usuario_camera", length=45)
	private String usuarioCamera;
	@Column(name="senha_camera", length=6)
	private String senhaCamera;
	@OneToMany(mappedBy="aluno", fetch=FetchType.EAGER)
	private List<Responsavel> responsaveis = new ArrayList<Responsavel>();
	@OneToMany(mappedBy="aluno")
	private List<Autorizado> autorizados = new ArrayList<Autorizado>();
	@OneToMany(mappedBy="aluno")
	private List<Periodo> periodos;
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getApelido() {
		return apelido;
	}
	public void setApelido(String apelido) {
		this.apelido = apelido;
	}
	public Date getDataNascimento() {
		return dataNascimento;
	}
	public void setDataNascimento(Date dataNascimento) {
		this.dataNascimento = dataNascimento;
	}
	public final Unidade getUnidade() {
		return unidade;
	}
	public final void setUnidade(Unidade unidade) {
		this.unidade = unidade;
	}
	public Boolean getIsento() {
		return isento;
	}
	public void setIsento(Boolean isento) {
		this.isento = isento;
	}
	public String getObservacao() {
		return observacao;
	}
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}
	public final Boolean getSorrisoSapeca() {
		return sorrisoSapeca;
	}
	public final void setSorrisoSapeca(Boolean sorrisoSapeca) {
		this.sorrisoSapeca = sorrisoSapeca;
	}
	public final String getUsuarioCamera() {
		return usuarioCamera;
	}
	public final void setUsuarioCamera(String usuarioCamera) {
		this.usuarioCamera = usuarioCamera;
	}
	public final String getSenhaCamera() {
		return senhaCamera;
	}
	public final void setSenhaCamera(String senhaCamera) {
		this.senhaCamera = senhaCamera;
	}
	public final List<Responsavel> getResponsaveis() {
		return responsaveis;
	}
	public final void setResponsaveis(List<Responsavel> responsaveis) {
		this.responsaveis = responsaveis;
	}
	public final List<Autorizado> getAutorizados() {
		return autorizados;
	}
	public final void setAutorizados(List<Autorizado> autorizados) {
		this.autorizados = autorizados;
	}
	public final List<Periodo> getPeriodos() {
		return periodos;
	}
	public final void setPeriodos(List<Periodo> periodos) {
		this.periodos = periodos;
	}
	@Transient
	public final String getIdade() {
		return calcularIdade(this.dataNascimento);
	}
	
	private String calcularIdade(Date dataNascimento) {
		DateTime hoje = new DateTime();
		DateTime dtNascimento = new DateTime(dataNascimento);
		
		String idade = SIGVBEnum.VAZIO.getValor();
		
		int diferencaAnos = Years.yearsBetween(dtNascimento, hoje).getYears();
		if (diferencaAnos > 0) {
			idade = idade.concat(diferencaAnos + (diferencaAnos == 1 ? " ano " : " anos "));
			dtNascimento = dtNascimento.plusYears(diferencaAnos);
		}
		int diferencaMeses = Months.monthsBetween(dtNascimento, hoje).getMonths();
		if (diferencaMeses > 0) {
			idade = idade.concat(diferencaMeses + (diferencaMeses == 1 ? " mes " : " meses "));
			dtNascimento = dtNascimento.plusMonths(diferencaMeses);
		}
		int diferencaDias = Days.daysBetween(dtNascimento, hoje).getDays();
		if (diferencaDias != 0)
			idade = idade.concat((!idade.equalsIgnoreCase(SIGVBEnum.VAZIO.getValor()) ? "e " : idade) + diferencaDias + (diferencaDias == 1 ? " dia " : " dias "));
		
		return idade;  
	}
	
	@Override
	public boolean equals(Object objeto) {
		Aluno aluno = (Aluno) objeto;
		return aluno.getId().equals(this.getId());
	}
}
